/*
 * @Author: hwxz 1710919934@qq.com
 * @Date: 2025-11-04 21:26:42
 * @LastEditors: hwxz 1710919934@qq.com
 * @LastEditTime: 2025-11-06 17:55:54
 * @FilePath: \MicInter_IPCamera\src\main.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <Arduino.h>
#include <AccelStepper.h>
#include <WiFiClient.h>
#include "WiFiConfig.h"
#include <DWJ_MQTT.h>

// 电机引脚定义
#define dirPin 1
#define stepPin 2
#define enPin 3


// 电机控制参数
unsigned long stepDelay = 0; // 初始为0，电机不转
bool motorDirection = HIGH;  // 电机方向
bool shouldRun = false;      // 是否应该转动（新增标志位）
bool mqttStarted = false;    // MQTT是否已启动

// 选择协议类型
#define USE_SSL_PROTOCOL true // true=SSL协议, false=TCP协议

// 创建WiFi配网对象（AP名称可自定义，密码留空为开放热点）
WiFiConfig wifiConfig("MICINTER_IPCAMERA", "");

AccelStepper stepper(1, stepPin, dirPin);

#if USE_SSL_PROTOCOL
// SSL协议配置（需要CA证书）优先自动化配网网络！
MQTT_Config config = {
    "",                    // WiFi名称
    "",                          // WiFi密码
    "b00001b0.ala.cn-hangzhou.emqxsl.cn", // MQTT服务器地址
    8883,                                 // MQTT端口 (SSL端口)
    "mqttx_da5aa4aa",                     // 客户端ID
    "username",                           // MQTT用户名
    "password",                           // MQTT密码
    "Android_Get",                        // 接收主题
    "Android_Set",                        // 发送主题
    MQTT_PROTOCOL_SSL,                    // 协议类型
    R"EOF(
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
)EOF"                                     // CA证书
};

#else
// TCP协议配置（不需要CA证书）
MQTT_Config config = {
    "Kilig1332232308", // WiFi名称
    "dwj080900",       // WiFi密码
    "broker.emqx.io",  // MQTT服务器地址
    1883,              // MQTT端口 (TCP端口)
    "DWJLOVESWJ",      // 客户端ID
    "",                // MQTT用户名
    "",                // MQTT密码
    "DWJ_Get",         // 接收主题
    "DWJ_Set",         // 发送主题
    MQTT_PROTOCOL_TCP, // 协议类型
    nullptr            // CA证书 (TCP不需要)
};
#endif

void setup()
{
  Serial.begin(115200);

  // 初始化电机引脚
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(enPin, OUTPUT);
  digitalWrite(enPin, LOW); // 启用电机驱动器

  // 设置初始方向
  digitalWrite(dirPin, motorDirection);

  Serial.println("=== MQTT演示程序 ===");
  Serial.print("协议类型: ");
  Serial.println(USE_SSL_PROTOCOL ? "SSL (MQTTs)" : "TCP (MQTT)");

  // 初始化MQTT配置
  MQTT_Init(config);

  // 设置消息回调
  MQTT_SetMessageCallback([](String topic, String message)
                          {
        Serial.println("=== 收到MQTT消息 ===");
        Serial.print("主题: "); Serial.println(topic);
        Serial.print("消息: "); Serial.println(message);
        Serial.println("==================");

        // 处理MQTT消息
          if (message == "start" || message == "s")
          {
            // 启动电机
            shouldRun = true;  // 设置运行标志
            stepDelay = 50000; // 设置默认转速
            Serial.println("Starting motor - simple stepping");
          }
          else if (message == "stop")
          {
            // 停止电机
            shouldRun = false; // 清除运行标志
            stepDelay = 0;     // 设置为0确保停止
            Serial.println("Stopping motor");
          }
          else if (message.startsWith("speed:"))
          {
            // 设置速度，例如 "speed:10000" 表示10ms延迟
            int newDelay = message.substring(6).toInt();
            if (newDelay > 0)
            {
              stepDelay = newDelay;
              Serial.print("Set speed delay to: ");
              Serial.println(stepDelay);
            }
          }
          else if (message == "reverse")
          {
            // 反转方向
            motorDirection = !motorDirection;
            digitalWrite(dirPin, motorDirection);
            Serial.print("Direction changed to: ");
            Serial.println(motorDirection ? "HIGH" : "LOW");
          } });

  // 启动自动配网（AP+网页配网+自动重连）
  wifiConfig.begin();
}

void loop()
{
  // 处理配网逻辑（必须在loop中持续调用）
  wifiConfig.handleClient();

  // 若WiFi已连接且MQTT未启动，则启动MQTT（非阻塞触发一次）
  if (!mqttStarted && WiFi.status() == WL_CONNECTED)
  {
    if (MQTT_Begin())
    {
      mqttStarted = true;
      Serial.println("MQTT客户端启动成功!");
      Serial.print("当前协议: ");
      Serial.println(MQTT_GetProtocol() == MQTT_PROTOCOL_TCP ? "TCP" : "SSL");
    }
    else
    {
      Serial.println("MQTT客户端启动失败，稍后重试...");
    }
  }

  // 主循环 - 处理MQTT消息和重连（仅在已启动后）
  if (mqttStarted)
  {
    MQTT_Loop();
  }

  // 简单步进电机控制（仅在 shouldRun 为 true 时转动）
  if (shouldRun && stepDelay > 0)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500); // 脉冲宽度
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay); // 控制转速
  }

  // 小延迟防止CPU过载
  delay(10);
}